﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CastleDefender.Platform;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using CastleDefender.ConfigFolder;

namespace CastleDefender.Object.Items
{
    public partial class Item : Animation2D
    {
        #region VARIABLE

        protected int intType;
        protected bool blnActivated;
        protected int intSpeed;
        protected Rectangle recGameBounds;
        protected bool blnSupItem;
        protected TimeSpan tsTimeDestroyItem;
        protected bool blnDestroy;
        protected int intValue;
        protected SpriteFont sfFont;

        #endregion

        #region CONSTRUCTOR

        public Item(Game myGame, ref Texture2D texture, int widthFrame, int heightFrame,
            Vector2 position, bool supItem, int type, int speed, Rectangle gameBounds)
            : base(myGame, ref texture, widthFrame, heightFrame, false, false, position, Config.ItemTimeAnimation)
        {
            intType = type;
            intSpeed = speed;
            recGameBounds = gameBounds;
            blnSupItem = supItem;
            sfFont = myGame.Content.Load<SpriteFont>(Config.FolderFonts + "FontItems");

        }

        #endregion

        #region PUBLIC METHOD

        public override void Update(GameTime gameTime)
        {
            //Thiết lập khung hình cho vật phẩm
            recBounds = new Rectangle((int)vecPosition.X, (int)vecPosition.Y, intWidthFrame, intHeightFrame);

            //Vật phẩm rơi khi được khởi tạo
            FreeFall(gameTime);

            //Kích hoạt thuộc tính vật phẩm
            Activate();

            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            if (intValue != 0)
                sprBatch.DrawString(sfFont, "x" + intValue.ToString(), Position, Color.White);
            base.Draw(gameTime);
        }

        public void SetPropety(int value)
        {
            Activated = true;
            intValue = value;
        }

        #endregion

        #region PRIVATE METHOD

        //Khi vật phẩm bị chạm phải
        private void Activate()
        {
            if (blnActivated)
            {
                if (intActiveFrame >= frames[intState].Count - 1)
                {
                     Visible = false;
                }
            }

            if (blnDestroy && intActiveFrame >= frames[2].Count - 1)
            {
                Visible = false;
            }
        }

        //Tọa độ khi rơi của vật phẩm
        private void FreeFall(GameTime gameTime)
        {
            //Vật phẩm rơi khi chạm đất
            if (vecPosition.Y + intHeightFrame <= Config.GameSurFace)
            {
                vecPosition.Y += intSpeed;
            }

            //Tự hủy vật phẩm sau 1 khoảng thời gian
            tsTimeDestroyItem += gameTime.ElapsedGameTime;
            if (tsTimeDestroyItem >= TimeSpan.FromSeconds(Config.ItemTimeDestroy))
            {
                tsTimeDestroyItem -= TimeSpan.FromSeconds(Config.ItemTimeDestroy);
                blnDestroy = true;
                intState = 2;
                ActiveFrame = 0;
                
            }
        }

        #endregion

        #region PUBLIC PROPERTIES

        //Trả giá trị intType
        public int Type
        {
            get { return intType; }
        }

        //Nhận trả giá trị blnActivated
        protected bool Activated
        {
            get { return blnActivated; }
            set 
            {
                if (value)
                {
                    intState = 1;
                    intActiveFrame = 0;
                }
                blnActivated = value; 
            }
        }

        //Nhận trả giá trị blnSupItem
        public bool SupItem
        {
            get { return blnSupItem; }
            set { blnSupItem = value; }
        }

        #endregion

    }
}
